views:

102

answers:

2

alt text

Look please below this codes throw me : FormatException was unhandled by user code

Codes:

 satis.KDV = Decimal.Parse((from o in genSatisctx.Urun where o.ID == UrunID select o.Kdv).ToString());

How can i rewrite linq query?

+2  A: 

You are calling ToString on the query rather than a single result. Even though you may expect only one value to match your query, it will not return just a single value. You have to instruct it to do so using Single, First, Last or the variations of these that also return a default value (SingleOrDefault, FirstOrDefault, LastOrDefault).

In order to avoid an exception, you could change it to use Decimal.TryParse or you could change your code to use a default value if the LINQ query returns something that won't parse properly. I'd recommend the former or a combination.

Note that in the following example, I have added the call to SingleOrDefault. This ensures that only one value is parsed, even if no value is found, and that if there are multiple results, we get an exception (i.e. it enforces that we get exactly zero or one result to the query).

decimal parsedValue;
if (Decimal.TryParse(
     genSatisctx
     .Urun
     .Where(o => o.ID == UrunID)
     .Select(o=>o.Kdv)
     .SingleOrDefault()
     .ToString(), out parsedValue))
{
   satis.KDV = parsedValue;
}
Jeff Yates
If no value is found, that will throw a NullPointerException on the ToString call.
Jon Skeet
@Jon: Doesn't that depend on what `o.Kdv` is? If it's a Decimal or some other number, wouldn't default just be 0?
Jeff Yates
+1  A: 

You're calling ToString() on an IQueryable<T> - what did you expect the string to be? It's very unlikely to be anything which can be parsed as a decimal number!

My guess is that you want to call First() or Single(), but we can't really tell without more information. What's the type of o.Kdv?

I suspect you either want:

satis.KDV = (from o in genSatisctx.Urun 
             where o.ID == UrunID 
             select o.Kdv).First();

or

string kdvString = (from o in genSatisctx.Urun 
                    where o.ID == UrunID 
                    select o.Kdv).First();
decimal kdv;
if (decimal.TryParse(kdvString, out kdv))
{
    satis.KDV = kdv;
}
else
{
    // What do you want to do if it's not valid?
}
Jon Skeet