4

文字列フィールド、製品名が空、null になることがある linq クエリがあります。これはテーブルの新しいフィールドであり、データが入力されていない場合、クエリを実行するとエラーが発生します。私がする必要があるのは、null をチェックすることです。null の場合は、null/空の値をドロップダウン リストのテキスト値に置き換えます。私はいくつかのことを試しましたが、それを機能させることができません。

public IQueryable<Product> BindProduct([Control("ddProductName")] int? ProductNameId)
{
   var prod = from c in _DbContext.Products
      where c.ProductNameId == ProductNameId
      orderby string.IsNullOrEmpty(c.ProductName) ? ddProductName.SelectedItem.Text : c.ProductName,
      c.ItemNumber
      select c;
      return prod;
}

変更:

 public IQueryable<Product> BindProduct([Control("ddProductName")] int? ProductNameId)
    {
        var prodName = ddProductName.SelectedItem.Text;
        var prod = from c in _DbContext.Products
                   where c.ProductNameId == ProductNameId
                   let sortName = c.Name ?? prodName
                   orderby sortName, c.ItemNumber
                   select new { c, sortName };
        return prod;

    }

更新: 私は明確ではなかったと思います。私がする必要があるのは、null をチェックすることです。null の場合は、null/空の値をドロップダウン リストのテキスト値に置き換えます。

4

3 に答える 3

7

「Let」キーワードでうまくいくはずです。

LINQPad の例を次に示します。

var products = Enumerable.Range(0, 100).Select(q => new {ProductNameId = 1, ProductName = (q % 15 == 0 ? null : (q % 3 == 0 ? "Fizz" : (q % 5 == 0 ? "Buzz": q.ToString()))), ItemNumber = q});
var ddProductName_SelectedItem_Text = "FizzBuzz";
var ProductNameId = 1;
var prod = from c in products
                     where c.ProductNameId == ProductNameId
                     let sortName = c.ProductName ?? ddProductName_SelectedItem_Text
                     orderby sortName, c.ItemNumber
                     select c;
return prod; //prod.Dump(); //for linqpad debugging
于 2013-10-02T17:30:43.170 に答える
2

答えは私の仲間のブラッドから来ました。linq を使用して null/空の値を置き換える方法を知りたい人は、以下を参照してください。

public IQueryable<Product> BindProduct([Control("ddProductName")] int? ProductNameId)
{
    var prodName = ddProductName.SelectedItem.Text;
    var prod = _DbContext.Products.Where(c => c.ProductNameId == ProductNameId).ToList().Select
    (p =>
    {
        p.Name = string.IsNullOrEmpty(p.Name) ? prodName : p.Name;
        return p;
    }).OrderBy(p => p.Name).ThenBy(p => p.ItemNumber).AsQueryable();

    return prod;
}
于 2013-10-03T00:47:30.310 に答える
1

クエリで orderby を呼び出すと、LINQ to SQL はそれを SQL の order by ステートメントに解決しようとします。SQL には条件付きの order by ステートメント用のメソッドがないため、このメソッドは LINQ からのコンパイルに失敗します。

必要なことは達成できますが、サーバー側ではなくクライアント側でセットを注文する必要があります。私の提案は、順序付けなしでクエリを実行し、順序付けが必要な時点で、最初にコレクションを IEnumerable コレクションに変換することです。これにより、IQueryable からの結果がメモリに取り込まれ、オブジェクト コレクションに対して orderby を実行できるようになります。

基本的なフローは次のようになります: queryable.AsEnumerable().OrderBy()

ここで重要なことは、コレクションの列挙を要求した時点で、LINQ が IQueryable を SQL クエリに変換しようとすることです。http://blog.worldmaker.net/2013/mar/11/mini-lecture-linq-visualization/には、非常に優れた高レベルの説明があります。

于 2013-10-02T17:42:22.283 に答える