0

私はC#でこの形式のLINQクラスを持っています:

class Vehicle
{
  int _VehicleID
  int _ModelID

  EntetySet<Cars> _AllCars
  EntetySet<Bus> _AllBus
  EntetyRef<Driver> _Person
}

車のテーブル

CarsID | Manufacturer | Type
1000   | Honda        | Diesel
1001   | Mitsubishi   | Petrol
1002   | Maruti       | Diesel

バステーブル

BusID | Manufacturer | Type
2000  | Volvo        | Diesel
2001  | TATA         | Petrol
2002  | layland      | Petrol

UI から、Vehicle ID をパラメーターとして取得します。それに基づいて、すべての車、バス、および関連するテーブルが変数にコピーされます。あれは:

Vehicle v1 = new Vehicle();
v1 = dc.vehicle.where(v => v.vehicleID == param.vehicleID).findfirst();

Myv1には、上記の条件を満たすすべてのテーブルとその内容があります。

ここで、テーブルの車とバスに存在するテーブルの内容に基づいて、さらにフィルター処理を行いたいと考えています。つまり、車両のガソリンまたはディーゼルのタイプに基づいています。

クエリステートメントを使用してガソリン車とバスをすべて 1 行でコピーしたい場合、方法を教えてください。

前もって感謝します。

4

2 に答える 2

2

**コメントに基づいて編集**

あなたの質問の論理は、私が車で論理的な人間のアプローチをとっていたので、どういうわけか私が滑ってしまいました。これを見るたびに、Vehicle class車やバスが乗り物であることがすぐにわかります。これは、ネーミングが適切に選択されていないことを示しています。しかし、私から判断することはもうありません。

ID ごとに 1 つの車両が必要であり、ガソリンなどに乗っている車とバスのみを 1 行で結果に含めたいとのご要望を承りました。それがSQLに変換された場合、ツリーが選択内でどこまで移動できるかわかりませんが、メモリ内にある場合は、サブ選択内で長い道のりを進むことができます。

「モデル」クラスを使用してそれを達成するか、匿名型を使用できますが、「モデル」クラスの例を示します。

例:

public class VehicleModel
{
    public int VehicleID { get; set; }
    public int ModelID { get; set; }
    public List<Cars> Cars { get; set; }
    public List<Bus> Buses { get; set; }
}

var vehicleID = 1; // just for the example of course.
var fuelType = "Petrol";
var vehicle = (from v in dc.vehicle 
               where v._VehicleID == vehicleID
               select new VehicleModel
               {
                   VehicleID = v._VehicleID,
                   ModelID = v._ModelID,
                   Cars = v._AllCars.Where(car => car.Type == fuelType).ToList(),
                   Buses = v._AllBus.Where(bus => bus.Type == fuelType).ToList()
               }).SingleOrDefault();
               // use FirstOrDefault() when _VehicleID is NOT unique to get TOP 1

エンティティ自体内の EntitySets を変更しないでください。これらのことには常にモデルを使用してください。これを行って EntityContainer で変更の保存を呼び出すと、あらゆる種類の問題が発生する可能性があるためです。

匿名型について知りたい場合は、こちらをご覧ください: http://msdn.microsoft.com/en-us/library/bb397696(v=vs.100).aspx

Linq の例については、こちらもご覧ください: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b




- 編集前

これを意味しますか:

var query = dc.vehicle.Where(v => 
                             v._AllCars.Any(c => c.Manufacturer == "Honda") ||
                             v._AllBuss.Any(b => b.Manufacturer == "Volvo"));

これにより、車がホンダである、またはバスがボルボであるすべての車両が得られます。どっちが:

1000 | ホンダ | ディーゼル
2000 | ボルボ | ディーゼル

結果は、基準を満たすすべての項目を含むか、またはまったく項目を含まない IEnumerable です。

最初のヒットだけが必要な場合は、次のことができます。

//if it must exist, otherwise this throws an exception
var firstVehicle = query.First();
//if it may exist, otherwise null
var firstVehicle = query.FirstOrDefault();
于 2012-10-22T14:19:31.183 に答える
1

次のようなものが欲しいようです:

var v1 = dc.vehicle.Where(v => v.vehicleID == param.vehicleID
                            && v.Cars.All(c => c.Type == "Petrol")
                            && v.Buses.All(c => c.Type == "Petrol")).First();

)

すべての車とバスがガソリンを持っている「車両」を取得します。(「_AllCars」などの型破りな名前ではなく、「Cars」を使用していることに注意してください)。

編集

または:

var v1 = dc.vehicle.Where(v => v.vehicleID == param.vehicleID)
    .Select(v => new {
                        Id = v.vehicleID,
                        Cars = v.Cars.Where(c => c.Type == "Petrol"),
                        Buses = v.Buses.Where(c => c.Type == "Petrol")
                     }).First();

フィルタリングされたコレクションで匿名型を取得します。

于 2012-10-22T14:17:07.227 に答える