Фильтровать базовый объект по свойствам дочерних объектов - PullRequest
0 голосов
/ 01 февраля 2012

Я искал решение уже несколько дней.

В моем приложении восемь сущностей, базовая и семь сущностей, которые наследуются от этой базовой сущности. Некоторые дочерние объекты имеют одинаковые свойства.

public class LogEntry(){
    public int LogEntryId{get;set;}
    public string ...
}

public class TestEntry : LogEntry{
   ....
   public string SomeProperty{get;set;} //SomePropertyThatIsNotInBaseClass
   ....
}
public class XEntry : LogEntry{
   ....
   public string SomeProperty{get; set;}
   ....
}

Я пытаюсь отфильтровать базовую сущность этим SomeProperty. Я пытаюсь запросить как

var value = Db.LogEntry.Where(i=>i.SomePropery == "some string");

Это не разрешено.

я могу получить только то, что хочу
IQueryable<LogEntry> first = Db.LogEntry.OfType<TestEntry>.Where(i=>i.SomeProperty == "...");
IQueryable<LogEntry> second = Db.LogEntry.OfType<XEntry>.Where(i=>i.SomeProperty == "...");
...

И объединить их в конце. Есть ли более умный способ сделать, чем этот метод? Методы расширения и т.д ...

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 02 февраля 2012

Редактировать

Если присмотреться к вашему примеру более подробно, я не думаю, что вы пытаетесь сделать возможным.Если вы пишете запрос к типу сущности BASE, то вы можете запрашивать только те поля, которые определены в базовом типе.

Поскольку "SomeProperty" не определено в LogEntry, вы не можете написать этот запрос:

var logEntries = db.LogEntry.Where(r => r.SomeProperty == "foo");

Поскольку SomeProperty не определено в классе LogEntry.

Если вы хотите писать запросы к базовому классу, вам нужно сделать что-то вроде следующего:

public class TPTContext : DbContext
{
    public TPTContext() : base("name=TPT")
    { }

    public DbSet<BillingDetail> BillingDetails { get; set; }
}

public abstract class BillingDetail
{
    public int BillingDetailId { get; set; }
    public string Owner { get; set; }
    public string Number { get; set; }
}

[Table("BankAccounts")]
public class BankAccount : BillingDetail
{
    public string BankName { get; set; }
    public string Swift { get; set; }
}

[Table("CreditCards")]
public class CreditCard : BillingDetail
{
    public int CardType { get; set; }
    public string ExpiryMonth { get; set; }
    public string ExpiryYear { get; set; }
}

Я написал следующий запрос к базовому классу:

TPTContext db = new TPTContext();

var allAccounts = db.BillingDetails.Where(b => b.Owner == "boran");
var bankAccounts = allAccounts.OfType<BankAccount>();
var creditCards = allAccounts.OfType<CreditCard>();

Кажется, у меня все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...