**コメントに基づいて編集**
あなたの質問の論理は、私が車で論理的な人間のアプローチをとっていたので、どういうわけか私が滑ってしまいました。これを見るたびに、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();