1

モデルに基づいて IQueryable を返そうとしています。

しかし、同じルックアップ テーブルに 2 回参加する必要があります。次に、クエリ変数をグリッドビューに返します。

public IQueryable<Benchmark> GetBenchMarks([QueryString("hydrant")] string hydrant,
[QueryString("revdate")] string revdate, [QueryString("street")] string street,
[QueryString("quadrant")] string quadrant, [QueryString("desc")] string desc) {

    IQueryable<Benchmark> query = from p in _db.Benchmarks
    join s in _db.Streets on p.Street1Number equals s.Id
    join s2 in _db.Streets on p.Street2Number equals s2.Id
    select new {
        Street1Name = s.StreetName,
        p.OrderNumber,
        p.HydrantNumber,
        Street2Name = s2.StreetName,
        p.RevisionDate,
        p.Quadrant,
        p.Description,
        p.Street1Number
    };
}

そのため、s2 への 2 番目の結合に赤い波線があります。そして、次のエラー。

Error 5 Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.IQueryable<Benchmarks.Model.Benchmark>'. An explicit conversion exists (are you missing a cast?) C:\Projects\Benchmarks\Benchmarks\Benchmarks_Home.aspx.cs 63 25 Benchmarks

4

2 に答える 2

2

クエリをselect new {...}で終了するため、結果ごとに匿名オブジェクトを作成しています。代わりに を使用するselect pと、各結果は になりますBenchmark

ただし、 a を返すことBenchmarkはあなたが望むものではないようです。この場合、クエリをIQueryableor型に変更する必要があります (また、!を返さない限りIQueryable<dynamic>、関数の戻り値の型も変更する可能性があります)。GetBenchMarksIQueryable<Benchmark>

2 番目の (おそらくより良い) 代替案は、この匿名型を表すクラスを作成し、それを使用することです。

于 2013-01-22T21:32:56.183 に答える
0

クエリの結果はIEnumerable匿名オブジェクトであるため、に変換できませんBenchmark

Street1Name結合されたリレーションから追加のプロパティ ( - 明らかに DB にマップされていない)を設定したい場合は、次のようにします。

 IQueryable<Benchmark> query = from p in _db.Benchmarks
            join s in _db.Streets on p.Street1Number equals s.Id
            join s2 in _db.Streets on p.Street2Number equals s2.Id
        select new { 
                 ....
        };
 var ex = query.ToList();
 var result = new List<Benchmark>();
 foreach(bn in ex){
      result.Add(new Benchmark{ OrderNumber = bn.OrderNumber .... });
 }
// return result.AsQueryable();   
// but now it losts the point to return it as queryable, because the query was already executed so I would simply reurn that list
 return result;

別のオプションは、クエリからオブジェクトを表す新しいクラスを作成し、次のようにメソッドから返すことです。

... select new LoadedBenchmark { Street1Name = s.StreetName ....}
于 2013-01-22T21:43:54.900 に答える