Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Have a read of <a href="http://msdn.microsoft.com/en-us/library/bb386909.aspx" rel="noreferrer">this documentation</a> which explains how linq and c# can experience a disconnect.</p> <p>Since Linq expressions are expected to be reduced to something other than plain methods you may find that this code breaks if later it is used in some non Linq to Objects context.</p> <p>That said </p> <pre><code>String.IsNullOrEmpty(fromname) || ( !String.IsNullOrEmpty(fromname) &amp;&amp; msg.FromName.ToLower().Contains(fromname.ToLower()) ) </code></pre> <p>Is badly formed since it should really be</p> <pre><code>String.IsNullOrEmpty(fromname) || msg.FromName.ToLower().Contains(fromname.ToLower()) </code></pre> <p>which makes it nice and clear that you are relying on msg and msg.FromName to both be non null as well.</p> <p>To make your life easier in c# you could add the following string extension method</p> <pre><code>public static class ExtensionMethods { public static bool Contains( this string self, string value, StringComparison comparison) { return self.IndexOf(value, comparison) &gt;= 0; } public static bool ContainsOrNull( this string self, string value, StringComparison comparison) { if (value == null) return false; return self.IndexOf(value, comparison) &gt;= 0; } } </code></pre> <p>Then use:</p> <pre><code>var messages = (from msg in dc.MessageItems where msg.FromName.ContainsOrNull( fromname, StringComparison.InvariantCultureIgnoreCase) select msg); </code></pre> <p>However this is not the problem. The problem is that the Linq to SQL aspects of the system are trying to use the <code>fromname</code> value to construct the <em>query</em> which is sent to the server.</p> <p>Since <code>fromname</code> is a variable the translation mechanism goes off and does what is asked of it (producing a lower case representation of <code>fromname</code> even if it is null, which triggers the exception).</p> <p>in this case you can either do what you have already discovered: keep the query as is but make sure you can always create a non null fromname value with the desired behaviour even if it is null.</p> <p>Perhaps better would be:</p> <pre><code>IEnumerable&lt;MessageItem&gt; results; if (string.IsNullOrEmpty(fromname)) { results = from msg in dc.MessageItems select msg; } else { results = from msg in dc.MessageItems where msg.FromName.ToLower().Contains(fromname) select msg; } </code></pre> <p>This is not so great it the query contained other constraints and thus invovled more duplication but for the simple query actually should result in more readable/maintainable code. This is a pain if you are relying on anonymous types though but hopefully this is not an issue for you.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload