|
I would have thought that the database was the repository, but what do I know?
|
|
|
|
|
I haven't used Repository as an Official Pattern (TM), so this might be completely barking up the wrong tree. Feel free to ignore if so (actually, better to comment and tell me :P). But as I understand it, a repository is essentially a local (i.e. in memory within the client process) cache of entities which have been loaded from the database. It's also a writeable cache (so you can save entities to it, and some time later, they get fully persisted).
They are useful when the data is:
- For a reading repository:
- Non volatile, i.e. they don't change very often. A cache that has to refresh every request is no use.
- Large. You still have to check whether there's been a change (usually involves adding more to the data source and a small amount of overhead), so the cached data needs to be large enough that the request for 'has it changed' isn't as much effort as just getting the data would be. Note that this generally means that you can't cache at the single entity (i.e. one row) level, as finding out if a row changed is as heavy as just returning the row, unless the row is very large and bandwidth to the database is an issue. (If you don't care if your information is out of date, you don't need to ask the DB and you can ignore this. But usually you do care.)
- For a writable repository:
- Not shared between processes, or not synchronisation-critical. There's no point having a write-back cache if you have to invalidate it immediately to synchronise the data with another process. However, if you are updating things frequently, and don't need every change to commit to the database immediately, you can save a lot of database updates.
They're also useful if database access is expensive, and your client is the only consumer (so you don't need to worry about synchronisation and changes occuring from elsewhere while you're running). In that case you can use a repository as a local cache of the database and only ever have to read any particular item once.
|
|
|
|
|
Thanks for the explanation. If someone can comment and verify this as an acceptable and valid explanation then I will go with it. It makes plenty of sense to me. Thanks.
djj55: Nice but may have a permission problem
Pete O'Hanlon: He has my permission to run it.
|
|
|
|
|
I have a list of KeyValuePairs:
List<KeyValuePair<Guid, string>> someList;
(And it is populated with several hundred KeyValuePairs of Guids and strings.)
I want to determine if this list of KeyValuePairs contains a certain string value as part of its values. One way to do this is to loop through each KeyValuePair as follows:
bool onList = false;
foreach (KeyValuePair<Guid, string> kvp in someList)
{
if (kvp.Value.Equals(someStringValue))
{
onList = true;
break;
}
}
if (onList)
{
}
However, this seems like a clunky way to perform this check. It seems to me that there must be a way to use the ‘Contains’ method of the List object or Linq to perform this check, but I can’t seem to get the semantics right.
Perhaps something like:
var someValue = someList.Where(kvp => kvp.Value.Equals(someStringValue));
Any suggestions?
-NP
Never underestimate the creativity of the end-user.
|
|
|
|
|
In essence you are mirroring a Dictionary here. Why not just use that instead?
|
|
|
|
|
|
Ennis, Please see my comment on this thread. thanks, Bill
"Is it a fact - or have I dreamt it - that, by means of electricity, the world of matter has become a great nerve, vibrating thousands of miles in a breathless point of time? Rather, the round globe is a vast head, a brain, instinct with intelligence!" - Nathanial Hawthorne, House of the Seven Gables
|
|
|
|
|
NickPace wrote: var someValue = someList.Where(kvp => kvp.Value.Equals(someStringValue)); // which doesn’t work
Not sure if it is a typo but you don't select anything in the line below
var someValue = someList.Where(kvp => kvp.Value.Equals(someStringValue));
It should be something like:
var someValue = someList.Where(kvp => kvp.Value.Equals(someStringValue)).Select(kvp=>kvp).FirstOrDefault();
Than you could check if it exits simply by comparing someValue.Value with string.Empty.
If not found the FirstOrDefault() method will initialize it with the default values witch is string.Empty for strings.
But there are more speedier approaches to this such as Dictionary, HashTable...
All the best,
Dan
|
|
|
|
|
That works good, except I had to compare to null instead of a string because it returns a KeyValuePair object. But you got me on the right track. I guess I need to buy a good book on LINQ as I still struggle with it.
And I agree that a Dictionary or HashTable would be better, but I'm stuck with the List that is passed to my method.
Thanks again for your reply. It was very helpful.
-NP
Never underestimate the creativity of the end-user.
|
|
|
|
|
I am not sure I understand entirely. Why is it that you are stuck with the List?
djj55: Nice but may have a permission problem
Pete O'Hanlon: He has my permission to run it.
|
|
|
|
|
Short version: The company I work for, in their infinite wisdom, decided to outsource some of our code. The 'List' comes from the Data Access Layer that they coded and is used primarily as a datasource for comboboxes. And even though I have access to their code, I am not allowed to touch it...something about licensing, intellectual property, and the infinite wisdom of my company and some other political BS which I just don't care about anymore. I could ask them to code a Dictionary or HashTable for me, but I don't feel like it. So I basically do my best to work around the crap that is sent to me (which probably sounds familiar to most coders out there).
The long version includes several pages of expletives. Use your imagination...
-NP
Never underestimate the creativity of the end-user.
|
|
|
|
|
Haha, that sheds a whole new light on the situation. I though at first that you simply were not sure how to go about using a Dictionary, in which case I could have been of help. My apologies. Good luck with those non-coding, outsourced geniuses.
djj55: Nice but may have a permission problem
Pete O'Hanlon: He has my permission to run it.
|
|
|
|
|
Ok, might be a stupid question here, but ... Why doesn't the first line work? The someList.Where returns IEnumerable<t> right? So, shouldn't someValue just be enumerable?
I'm not sure what Select is doing there either. It transforms a kvp to a kvp, so doesn't that mean the entire Select is just removable?
|
|
|
|
|
You can always use LINQ.
If you want to search by the GUID (key) make your search criteria GUID .
IEnumerable result = someList.Where(y=>y.Key.Contains(searchGUID));<br />
You can always search on the value as below.
IEnumerable result = someList.Where(y=>y.Value.Contains(searchString));
In both cases, result will contain the final search result.
Note that performance may or may not be better than using a loop.
LINQ makes it easier to write code, performance is generally better (but not always).
Too much of heaven can bring you underground
Heaven can always turn around
Too much of heaven, our life is all hell bound
Heaven, the kill that makes no sound
|
|
|
|
|
If you want a replacement for Contains() , you don't need to use Where() ... Any() means "If any member of the list satisfies this condition" (Opposite would be !All() )
bool onList = someList.Any(kvp => kvp.Value.Equals(someStringValue));
|
|
|
|
|
If you have to do that frequently, you should probably reengineer the whole thing.
Another way would be to define a specific class to hold the data and implement the Equals method.
|
|
|
|
|
Try this:
var result = someList.FindAll(delegate(KeyValuePair<Guid, string> q) {return q.Value.Equals(someStringValue);});
You can use Find for single values also.
Its the man, not the machine - Chuck Yeager
If at first you don't succeed... get a better publicist
If the final destination is death, then we should enjoy every second of the journey.
|
|
|
|
|
This is the kind of question and discussion I'd so enjoy seeing more of on this forum, thanks, Nick.
It would be fascinating to know how the different techniques suggested here, including Ennis' suggestion of using a HashTable, compare in terms of speed and efficiency. This discussion on StackOverFlow may be relevant (?): [^]
In this case we don't know whether every string in each KeyValuePair is unique or not, and that could influence the gamut of solutions ?
Here's my suggestion, but I'm no Linq master:
List<KeyValuePair<Guid, string>> kvpList = new List<KeyValuePair<Guid, string>>();
private IEnumerable<string> sList;
private void testKVPToList()
{
for (int i = 1000; i < 2000; i++)
{
Guid guid = new Guid("F4168C51-CEB2-4EBC-B6BF-319B339D" + i.ToString());
kvpList.Add(new KeyValuePair<Guid, string>(guid,(i*5).ToString()));
}
sList = from kvp in kvpList select kvp.Value;
if(sList.Contains("5000")) Console.WriteLine("5000 found");
if(sList.Contains("9995")) Console.WriteLine("9995 found");
}
Whether 'tis better to take a 'one-time' hit and build a List, or to dynamically look-up on-the-fly: that's a good question ! And, if the goal is to build the fastest List to search ? My casual attempt to make a SortedList from a KeyValuePair List resulted in a pig that could not fly, but I'm sure there's a way
I'd certainly go and examine Mehdi Gholam's recent 'Hoot' full-text search be-all-and-end-all project[^], and see what he's doing there, because I'll bet it's as optimized as possible.
You can find some implementations of the Boyer-Moore algorithm here on CP:[^].
"Is it a fact - or have I dreamt it - that, by means of electricity, the world of matter has become a great nerve, vibrating thousands of miles in a breathless point of time? Rather, the round globe is a vast head, a brain, instinct with intelligence!" - Nathanial Hawthorne, House of the Seven Gables
modified on Thursday, September 8, 2011 2:45 AM
|
|
|
|
|
Thanks! That's good information you provided. Overall I am pleasantly surprised and pleased with the responses to my initial questions. Everyone provided some good ideas and I even learned a couple new things concerning LINQ.
This issue started out as a minor client-requested enhancement to one of their existing applications (hopefully just a one-time deal), and when I looked at the code in question I discovered the data I needed to compare against already existed in a List of KeyValuePairs, so really no need to query the database again. And thus my little quest began. When I saw the first response from Pete O'Hanlon, I thought: "Of course. I'll just cast the List to an equivalent Dictionary object and use its 'ContainsValue' method." Which I thought was going to work because it compiled just fine, but then threw an 'Invalid Cast' exception during runtime (same thing for a HashTable). And so the quest continued...
I eventually went with the answer provided by MDL=>Moshu. It works great. The List has about 2000 KeyValuePairs in it and the new search appears instantaneous to the end users. So though the code design may not be ideal, it works, it's stable, it performs well, and the client is happy. And that is what it is really all about.
-NP
Never underestimate the creativity of the end-user.
|
|
|
|
|
I am working with a C#.net 2008 console/windows form application that has imbedded third components. The third part components are written with visual studio.net 2005 and possibly some other language.
My question is, do you know of some why I can see if the third party components will expire at somec point? Basically is there something I can look at to see if those components will stop executing at some point? If so, can you point me to a how to determine what the expiration date is and/or point me to a url I can use as a reference?
|
|
|
|
|
I've not heard of DLLs expiring. The onyl way i can see you having a problem in the future in this regards is if the license to use those DLLs expires.
For that you will need to check the license under which you are using the DLLs
Pedis ex oris
|
|
|
|
|
How do I check the license under where the DLLs are used?
|
|
|
|
|
The license isn't generally a part of the DLL.
When you bought the 3rd party library you will have done so with a license agreement, this would be documented either as part of the install package in a manual or on the provider's website.
Essentially, DLLs don't expire; your legal right to use them might and some providers might enforce that rule through external logic within the install package (such as when your free-trial expires). 'If' and 'how' a provider enforces any time constraints varies by provider.
Pedis ex oris
|
|
|
|
|
Lets look at the problem form a different angle.
One must indeed keep track of the third-party user-agreement of the dll's.
But one must also think about where your api wil be used, in which environment.
for ex.
if one is developing for win 95 and the dll's are only for .net environments, one shall encouter a problem.
So when does an dll expire.
a) when the third-party agreement is at an end.
b) when the third-patry no longer supports the dll's (no upgrads)
c) when the end-user changes his/her computing environment.
d) when the developer changes his/her computing environment.
Kribo
htt://blog.kribo.be
|
|
|
|
|
hi there!
i have a big problem with memory releasing in c#, let me explain u my case:
i have a sql class (sqlconnection+ sqlDataAdapter )which fill a DataTable that contains about 34000 rows, now the memory consumtion goes up about twice than before query executed! but the problem is when user closes the host form, memory would not be released compeletly! so after 3 or 4 time execution, application stopped working and out of memory exception!
I tried this solutions: Disposing Table- GC.Finalize- GC.Collect and so but they wont return whole of memory...
plz HELPPPPP
|
|
|
|